export default {
  // 为当前模块开启命名空间
  namespaced: true,

  // 模块的 state 数据
  state: () => ({
    // 购物车的数组，用来存储购物车中每个商品的信息对象
    // 每个商品的信息对象，都包含如下 6 个属性
    // { user_id, goods_id, goods_name, goods_price, goods_count, goods_small_logo, goods_state }
    cart: JSON.parse(uni.getStorageSync('cart') || '[]'),
  }),

  // 模块的 mutations 方法
  mutations: {
    addToCart(state, goods) {
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      if (!findResult) {
        // 购物车中没有此商品，则添加该商品到购物车
        state.cart.push(goods)
      } else {
        // 购物车中有此商品，则数量+1（注意，这里的 findResult 为满足条件的商品对象引用地址）
        findResult.goods_count++
      }
      this.commit('m_cart/saveToStorage')
    },
    // 将购物车的数组保存到本地，并更新数据库
    async saveToStorage(state, user_cart) {
      // 若该用户有购物车数据，则和游客用户数据合并
      if (user_cart) {
        user_cart = JSON.parse(user_cart)
        if (user_cart.length !== 0) {
          user_cart.forEach(item => {
            let result = state.cart.find(item2 => item2.goods_id == item.goods_id)
            // 若游客购物车中已有该登录用户购物车中的某商品，则游客购物车中该商品数量+1
            if (result) {
              result.goods_count += item.goods_count
            }
            // 否则将该登录用户的购物车商品添加到游客购物车中（合并）
            else {
              // 合并之前，将用户数据中的勾选状态置为false
              item.goods_state = false
              state.cart.push(item)
            }
          })
        }
      }
      uni.setStorageSync('cart', JSON.stringify(state.cart))
      // 若用户已登录，则根据token更新数据库中该用户的购物车
      const token = uni.getStorageSync('token')
      if (token) {
        // 下边请求中传的值 state.cart 为数组类型
        const { data: res } = await uni.$http.post('/api/public/v1/users/updatecart', { token, cart: state.cart })
        if (res.meta.status !== 200) return uni.$showMsg('更新购物车数据失败！')
      }
    },
    // 更新购车车中商品的勾选状态
    updateGoodsState(state, goods) {
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      if (findResult) {
        findResult.goods_state = goods.goods_state
        this.commit('m_cart/saveToStorage')
      }
    },
    // 更新商品的数量
    updateGoodsCount(state, goods) {
      const findResult = state.cart.find(item => item.goods_id === goods.goods_id)
      if (findResult) {
        findResult.goods_count = goods.goods_count
        this.commit('m_cart/saveToStorage')
      }
    },
    // 重置商品的数量为1
    resetGoodsCount(state, goods_id) {
      const findResult = state.cart.find(item => item.goods_id === goods_id)
      if (findResult) {
        findResult.goods_count = 1
        this.commit('m_cart/saveToStorage')
      }
    },
    // 根据id删除商品
    removeGoodsById(state, goods_id) {
      state.cart = state.cart.filter(item => item.goods_id !== goods_id)
      this.commit('m_cart/saveToStorage')
    },
    updateAllGoodsState(state, newState) {
      state.cart.forEach(item => item.goods_state = newState)
      this.commit('m_cart/saveToStorage')
    },
    // 清空购物车（退出登录时调用）
    clearCart(state) {
      uni.setStorageSync('cart', '[]')
      state.cart = []
    }
  },

  // 模块的 getters 属性
  getters: {
    // 计算购物车中商品总数量
    total(state) {
      return state.cart.reduce((all, curentValue) => all + curentValue.goods_count, 0)
    },
    // 计算勾选商品的总数量
    checkedCount(state) {
      return state.cart.filter(item => item.goods_state).reduce((all, curentValue) => all + curentValue.goods_count, 0)
    },
    // 计算勾选商品的总价格
    totalPrice(state) {
      return state.cart
        .filter(item => item.goods_state)
        .reduce((all, currentValue) => all + currentValue.goods_count * currentValue.goods_price, 0)
        .toFixed(2)
    }
  },
}
